﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Markup;
using System.Windows.Media.Media3D;

namespace 数字孪生Demo.Base
{
    public class Superellipse : MarkupExtension
    {
        private double x, y, n;

        public Superellipse(double x, double y, double n)
        {
            this.x = x;
            this.y = y;
            this.n = n;
        }

        public Point3DCollection GeneratePoints()
        {
            var pc = new Point3DCollection(); // 创建 3D 点集合
            int m = 140; // 点的总数，用于控制分段精度

            // 遍历角度 0 到 2π，生成 m-1 个点
            for (int i = 0; i + 1 < m; i++)
            {
                double t = 2 * Math.PI * i / (m - 2); // 当前角度，范围 [0, 2π)

                // 使用超椭圆参数公式计算 x 和 y 坐标
                pc.Add(new Point3D(
                    x * Math.Sign(Math.Cos(t)) * Math.Pow(Math.Abs(Math.Cos(t)), 2 / n),  // x 坐标
                    -y * Math.Sign(Math.Sin(t)) * Math.Pow(Math.Abs(Math.Sin(t)), 2 / n), // y 坐标，取负值是为了符合 WPF 坐标系
                    0)); // z 坐标恒为 0，平面曲线
            }

            pc.Add(pc[0]); // 添加起点作为终点，闭合曲线

            return pc; // 返回点集
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return GeneratePoints();
        }
    }
}
